package com.syedu.day04;

/**
 * 递归算法
 * 在方法内部,自己调用自己的过程
 * 递归可以用极少的代码来解决很多复杂但是具有规律的运算
 *
 * 本质:在运算中保留中间值进行递归计算
 * 缺点:性能较差,因为每次递归过程都要计算中间值,然后还需要保存,
 *     所以,不到万不得已不要使用.
 *
 * 注意: 递归时需要指定递归出口,否则抛出异常错误:java.lang.StackOverflowError(内存区域被挤爆),导致JVM崩溃
 *
 * @author easonsy
 */
public class RecursiveDemo {
    public static void main(String[] args) {
        /*long fac = fac(10);
        System.out.println(fac);*/

        /*int feibo = feibo(10);
        System.out.println(feibo);*/

        int age = getAge(5);
        System.out.println(age);
    }

    /**
     * 递归阶乘
     */
    public static long fac(int num) {
        //递归出口
        if (num == 1) {
            return 1;
        }
        return num * fac(num - 1);
    }

    /**
     * 斐递归波那契数列
     * 1   1   2   3   5   8   13  21  34  55 ...
     */
    public static int feibo(int pos) {
        if (pos == 1 || pos == 2) {
            return 1;
        }
        return feibo(pos - 1) + feibo(pos - 2);
    }

    /**
     * 有5个人坐在一起，问第五个人多少岁？他说比第4个人大2岁。问第4个人岁数，他说比第3个人大2岁。
     * 问第三个人，又说比第2人大两岁。问第2个人，说比第一个人大两岁。最后问第一个人，他说是10岁。请问第五个人多大？
     *
     * @param n 第几个人
     */
    public static int getAge(int n) {
        if (n == 1) {
            return 10;
        }
        return 2 + getAge(n - 1);
    }
}